import tensorflow as tf
import numpy as np

# z = np.random.randint(0, 10, size=[10])
# y = tf.one_hot(z, 10, on_value=1, axis=0)
# with tf.Session() as sess:
#     print(z)
#     print(sess.run(y))


# arr1 = np.array([1, 2, 3])
# arr2 = np.array([4, 5, 6])
# print("竖直方向上堆叠：\n", np.vstack((arr1, arr2)))
# print("水平方向上堆叠：\n", np.hstack((arr1, arr2)))
# arr3 = np.array([[1, 2], [3, 4], [5, 6]])
# arr4 = np.array([[7, 8], [9, 10], [11, 12]])
# print("arr3\n", arr3)
# print("arr4\n", arr4)
# print("竖直方向上堆叠：\n", np.vstack((arr3, arr4)))
# print("水平方向上堆叠：\n", np.hstack((arr3, arr4)))


# arr = np.arange(10)
# print(arr)
# np.random.shuffle(arr)
# print("一维数组乱序\n",arr)
# arr =np.arange(18).reshape((9, 2))
# print(arr)
# np.random.shuffle(arr)
# print("二维数组乱序(仅对第1维首维进行乱序）\n", arr)


def next_batch():
    datasets = np.asarray(range(0, 20))
    # tf.train.slice_input_producer是一个tensor生成器，作用是按照设定，每次从一个tensor列表中按顺序或者随机抽取出一个tensor放入文件名队列。
    input_queue = tf.train.slice_input_producer([datasets], shuffle=False, num_epochs=1)
    '''利用一个tensor的列表或字典来获取一个batch数据
    tensors：一个列表或字典的tensor用来进行入队
    batch_size：设置每次从队列中获取出队数据的数量
    num_threads：用来控制入队tensors线程的数量，如果num_threads大于1，则batch操作将是非确定性的，输出的batch可能会乱序
    capacity：一个整数，用来设置队列中元素的最大数量
    enqueue_many：在tensors中的tensor是否是单个样本
    shapes：可选，每个样本的shape，默认是tensors的shape
    dynamic_pad：Boolean值.允许输入变量的shape，出队后会自动填补维度，来保持与batch内的shapes相同
    allow_samller_final_batch：可选，Boolean值，如果为True队列中的样本数量小于batch_size时，出队的数量会以最终遗留下来的样本进行出队，如果为Flalse，小于batch_size的样本不会做出队处理
    shared_name：可选，通过设置该参数，可以对多个会话共享队列
    name：可选，操作的名字'''
    data_batchs = tf.train.batch(input_queue, batch_size=5, num_threads=1, capacity=20, allow_smaller_final_batch=False)
    return data_batchs


data_batchs = next_batch()
sess = tf.Session()
# 初始化计算图中所有的局部变量
sess.run(tf.initialize_local_variables())
for i in range(100):
    data = sess.run([data_batchs])
    print(data)
sess.close()

# # 创建四个变量
# A = [[1, 3, 4, 5, 6]]
# B = [[1, 3, 4, 3, 2]]
# y1 = [[0.15, 0.32, 0.41, 0.72]]
# y2 = [[0, 0, 0, 1]]
# with tf.Session() as sess:
#     # 逐个逐个的比较相等还是不相等
#     print(sess.run(tf.equal(A, B)))
#     # tf.argmax(vector, 1)：返回的是vector中的最大值的索引号
#     print("y1的最大值的下\n", sess.run(tf.argmax(y1, 1)))
#     # 对比y1,y2最大值下标是否相同
#     print(sess.run(tf.equal(tf.argmax(y1, 1), tf.argmax(y2, 1))))
